#pragma once

#include <QApplication>
#include <thread>
#include "client/rpc_client.h"
#include "monitor_widget.h"

int main(int argc, char* argv[]) {
  // 在这里有一个bug： 见下面
  QApplication app(argc, argv); 
  monitor::MonitorWidget moitor_widget;
  monitor::RpcClient rpc_client;
  monitor::proto::MonitorInfo monitor_info;

  //get board name
  rpc_client.GetMonitorInfo(&monitor_info);
  std::string name = monitor_info.name();
  // 这里用了多态。 展示窗口。QWidget 是所有QT窗口的父类 。 
  QWidget* widget = moitor_widget.ShowAllMonitorWidget(name);
  widget->show();

  std::unique_ptr<std::thread> thread_;
  // 线程执行： 获取grpc从monitor得到的信息。将信息更新到QTapplication的对象。之后睡2秒。 
  thread_ = std::make_unique<std::thread>([&]() {
    while (true) {
      monitor_info.Clear() ; // 在这里要把protobuf清空 。 
      rpc_client.GetMonitorInfo(&monitor_info);

      moitor_widget.UpdateData(monitor_info);
      std::this_thread::sleep_for(std::chrono::seconds(2)); // 每两秒更新一次。 
    }
  });
   //  原先使用thread_->join() ; 在等待线程结束。
   //  但是QT要进入循环需要QApplication 的对象调用exec() ; 
  thread_->detach();

  return app.exec();
}